function deepClone(obj, map = new WeakMap()) {
  if (typeof obj !== "object" || obj === null) return obj;

  // 检查是否已经拷贝过（解决循环引用）
  if (map.has(obj)) return map.get(obj);

  // 特殊对象
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);

  // 普通对象或数组
  let result = Array.isArray(obj) ? [] : {};
  map.set(obj, result);

  for (let key in obj) {
    //判断 某个属性是不是对象自身“直接拥有”的属性，而不是从原型链继承下来的。
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key], map);
    }
  }

  return result;
}

//

//测试
const a = { name: "lucas" };
a.self = a;

const copy = deepClone(a);

console.log(copy.self === copy); // true ✅ 循环引用被保留
console.log(copy === a); // false ✅ 不是同一个对象
